package cn.mily.basics.utils;

import cn.mily.basics.constant.Constant;
import cn.mily.basics.exception.UtilException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;

/**
 * 发送验证码工具类
 */
@Component
public class VerificationCode {

    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 1.验证码生成4 位
     * 2.保存到redis 中并设置过期时间 5m
     * 3.在 value中添加时间戳 一分钟以内不能再次发短信息
     * 4.key中添加标识符字符串以便区分
     */
    public void sendVerCode(String phone) throws Exception {
        sendVer(phone, Constant.USER_REG);
    }

    /**
     * 微信和用户账号绑定时验证码
     */
    public void sendVerCodeByBander(String phone){
        sendVer(phone,Constant.USER_BANDER);
    }

    /**
     * 发送验证码
     */
    private void sendVer(String phone,Constant constan){
        try {
            /*判断当前手机号是否在一分钟内发送过*/
            String s = (String)redisTemplate.opsForValue().get(phone + ":" + constan);
            if(StringUtils.isEmpty(s)){
                /*生成4位验证码*/
                String verCode = StrUtils.getComplexRandomString(4);
                /*将数据存入redis中 并设置五分钟有效期*/
                redisTemplate.opsForValue().set(phone+":"+ constan, verCode+":"+System.currentTimeMillis(),5, TimeUnit.MINUTES);
            }else{
                /*当redis中有用户的验证码的时候*/
                /*获取redis中的时间戳*/
                String[] split = s.split(":");
                if(System.currentTimeMillis()-new Long(split[1])<=60){
                    /*发送验证码时间没超过1分钟*/
                    throw new UtilException("抱歉！请一分钟后再试！");
                }
            }
            String cs =((String) redisTemplate.opsForValue().get(phone + ":" + constan)).split(":")[0];
            /*发送验证码*/
            s = "你的验证码为:"+cs+"请在5分钟内输入！";
            SendMsg_webchinese.sendVerCodeMsg(phone, s);
            System.out.println(s);
        }catch (Exception e){
            e.printStackTrace();
            //throw new Exception("验证码发送失败！");
        }
    }
}
